﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data.SqlClient;
using System.Data;

namespace DataAccess
{
    public class ControllerMensaje
    {
        #region ATRIBUTOS

        private SqlConnection conexion = DBConnection.getInstancia().getConnection();
        private static ControllerMensaje unConMen;

        #endregion
        
        #region SINGLETON

        public static ControllerMensaje getInstancia()
        {
            if(unConMen == null)
            {
                unConMen = new ControllerMensaje();
            }
            return unConMen;
        }
       
        #endregion

        #region CONSTRUCTORES

        private ControllerMensaje()
        {}

        #endregion

        #region METODOS

        //Insertar nuevo mensaje.
        public void insertMensaje(string pTexto, Int32 pNroSolicitud)
        {
            try
            {
                //Sentencia sql.
                string sql = "INSERT INTO mensajes(mentexto, mennrosolicitud) VALUES (@mentexto, @mennrosolicitud);";
                //Se crea el comando.
                SqlCommand comm = new SqlCommand(sql, conexion);
                comm.Parameters.AddWithValue("mentexto", truncar(pTexto,499));
                comm.Parameters.AddWithValue("mennrosolicitud", pNroSolicitud);

                //Se abre la conexion.
                conexion.Open();
                //Se ejecuta el comando.
                int x = comm.ExecuteNonQuery();

                //Si ninguna fila fue afectada se tira una excepcion.
                if(x == 0)
                {
                    throw new Exception("Error al insertar un nuevo mensaje");
                }
            }
            catch(Exception ex)
            {
                throw new Exception("Error al insertar un nuevo mensaje: " + ex.Message);
            }
            finally
            {
                //Se cierra la conexion.
                conexion.Close();
            }
        }

        //Update mensaje.
        public void updateMensaje(string pTexto, Int32 pMenId)
        {
            try
            {
                //Sentencia sql.
                string sql = "UPDATE mensajes SET mentexto=@mentexto WHERE menid=@menid;";
                //Se crea el comando.
                SqlCommand comm = new SqlCommand(sql, conexion);
                comm.Parameters.AddWithValue("mentexto", truncar(pTexto,499));
                comm.Parameters.AddWithValue("menid", pMenId);

                //Se abre la conexion.
                conexion.Open();
                //Se ejecuta el comando.
                int x = comm.ExecuteNonQuery();

                //Si ninguna fila se ve afectada, se tira una excepcion.
                if(x == 0)
                {
                    throw new Exception("Error al modificar el mensaje");
                }
            }
            catch(Exception ex)
            {
                throw new Exception("Error al modificar el mensaje: " + ex.Message);
            }
            finally
            {
                //Se cierra la conexion.
                conexion.Open();
            }
        }

        //Dar id del ultimo mensaje.
        /*public Int32 getUltimoId(Int32 pSol)
        {
            Int32 maxId;
            try
            {
                //Se crea la sentencia sql, seleccionando el maximo id del campo menid de la tabla mensajes.
                string sql = "SELECT MAX(menid) FROM mensajes WHERE mennrosolicitud = @nrosolicitud";
                //Se crea el comando.
                SqlCommand comm = new SqlCommand(sql, conexion);
                comm.Parameters.AddWithValue("nrosolicitud", pSol);
                //Se abre la conexion.
                conexion.Open();
                //Se le asigna el resultado de la consulta a la variable maxId.
                maxId = (Int32)comm.ExecuteScalar();
            }
            catch(Exception ex)
            {
                throw new Exception("Error al obtener el maximo id de la tabla mensajes: " + ex.Message);
            }
            finally
            {
                //Se cierra la conexion.
                conexion.Close();
            }
            //Se retorna el maximo Id.
            return maxId;
        }*/

        public Int32 getUltimoId(SqlTransaction unaTrans)
        {
            Int32 maxId;
            try
            {
                //Se crea la sentencia sql, seleccionando el maximo id del campo menid de la tabla mensajes.
                string sql = "SELECT MAX(menid) FROM mensajes";
                //Se crea el comando.
                SqlCommand comm = new SqlCommand(sql, conexion);
                comm.Transaction = unaTrans;
                //Se abre la conexion.
                //conexion.Open();
                //Se le asigna el resultado de la consulta a la variable maxId.
                maxId = (Int32)comm.ExecuteScalar();
            }
            catch (Exception ex)
            {
                throw new Exception("Error al obtener el maximo id de la tabla mensajes: " + ex.Message);
            }
            finally
            {
                //Se cierra la conexion.
                //conexion.Close();
            }
            //Se retorna el maximo Id.
            return maxId;
        }
        
        //Dar lista de mensajes por Numero de solicitud.
        public DataTable getListMensajesBySol(Int32 pNroSol)
        {
            //Consulta.
            string sql = "SELECT m.menid AS Id, m.mentexto AS Texto, m.menfecha AS Fecha FROM mensajes AS m WHERE m.mennrosolicitud = @nro AND m.menid NOT IN (SELECT resid FROM respuestas) ORDER BY menfecha DESC;";
            //Se crea el datatable.
            DataTable myDt = new DataTable();
            //Se crea el comando.
            SqlCommand myComm = new SqlCommand(sql, conexion);
            myComm.Parameters.AddWithValue("nro", pNroSol);
            //Se crea el data adapter para llenar la tabla y se le pasa el comando como parametro.
            SqlDataAdapter myDa = new SqlDataAdapter(myComm);
            try
            {
                //Se abre la conexion.
                conexion.Open();
                //Se llena la tabla con el data adapter.
                myDa.Fill(myDt);
            }
            catch (Exception ex)
            {
                throw new Exception("Error al buscar mensajes por numero de solicitud: " + ex.Message);
            }
            finally
            {
                //Se cierra la conexion.
                conexion.Close();
            }
            //Se devuelve el data table.
            return myDt;
        }
        string truncar(string unSt, int maxLength)
        {
            return unSt.Length <= maxLength ? unSt : unSt.Substring(0, maxLength);
        } 
        #endregion
    }
}
